import asyncio
from typing import List, Dict, Any, Optional
from app.core.config import settings
from app.utils.llm_utils import LLMProcessor
import logging

class AIClient:
    """AI分析工具类，用于处理图片和OCR文本"""
    
    @staticmethod
    async def analyze_product(image_paths: List[str], image_texts: Dict[str, str]) -> str:
        """
        分析产品图片和OCR文本，生成分析结果
        
        Args:
            image_paths: 图片路径列表
            image_texts: 图片OCR文本内容字典，键为图片名称，值为OCR文本
        
        Returns:
            str: 分析结果
        """
        try:
            # 提取所有文本内容
            all_texts = list(image_texts.values())
            
            # 提取产品名称（从第一个图片路径中获取）
            product_name = "未知产品"
            if image_paths:
                # 从路径中提取产品ID
                import os
                product_id = os.path.basename(os.path.dirname(image_paths[0]))
                # 从产品ID中提取产品名称（去掉UUID部分）
                product_name = product_id.split("_")[0] if "_" in product_id else product_id
            
            # 使用LLM分析文本内容
            analysis_result = await LLMProcessor.analyze_product(product_name, all_texts)
            return analysis_result
            
        except Exception as e:
            logging.error(f"分析产品失败: {str(e)}")
            return f"分析失败: {str(e)}"
    
    @staticmethod
    async def generate_product_summary(product_name: str, analysis_result: str) -> str:
        """
        根据分析结果生成产品总结
        
        Args:
            product_name: 产品名称
            analysis_result: 分析结果
        
        Returns:
            str: 产品总结
        """
        try:
            # 使用LLM生成总结
            from langchain_community.chat_models import ChatOpenAI
            from langchain.schema import HumanMessage
            
            llm = ChatOpenAI(
                temperature=0.7,
                model_name=settings.LLM_MODEL_NAME,
                openai_api_key=settings.QWEN_API_KEY,
                base_url=settings.QWEN_BASE_URL,
                streaming=False,
                openai_proxy=None
            )
            
            prompt = f"""请根据以下产品分析结果，用简短的语言生成一段产品总结，突出其核心优势和特点：
            
            产品名称: {product_name}
            
            分析结果:
            {analysis_result}
            
            总结字数控制在100-150字之间，语言要简洁、专业、有吸引力。
            """
            
            messages = [HumanMessage(content=prompt)]
            response = await llm.ainvoke(messages)
            
            return response.content
            
        except Exception as e:
            logging.error(f"生成产品总结失败: {str(e)}")
            return f"生成总结失败: {str(e)}"
    
    @staticmethod
    async def analyze_image_quality(image_path: str) -> Dict[str, Any]:
        """
        分析图片质量
        
        Args:
            image_path: 图片路径
        
        Returns:
            Dict[str, Any]: 图片质量分析结果
        """
        try:
            from PIL import Image, ImageStat
            import numpy as np
            
            # 打开图片
            img = Image.open(image_path)
            
            # 获取图片尺寸
            width, height = img.size
            
            # 转换为灰度图以分析亮度
            gray_img = img.convert('L')
            stat = ImageStat.Stat(gray_img)
            
            # 计算亮度
            brightness = stat.mean[0]
            
            # 计算对比度
            contrast = stat.stddev[0]
            
            # 计算清晰度
            arr = np.array(gray_img)
            laplacian = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
            sharpness = np.abs(np.sum(arr * laplacian))
            
            return {
                "size": {"width": width, "height": height},
                "resolution": width * height,
                "brightness": brightness,
                "contrast": contrast,
                "sharpness": sharpness,
                "is_high_quality": width >= 800 and height >= 800 and contrast > 50
            }
            
        except Exception as e:
            logging.error(f"分析图片质量失败: {str(e)}")
            return {"error": str(e)} 